package com.obelisco.vista.seguridad;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.ResourceBundle;

import javax.swing.text.TabableView;

import com.obelisco.modelo.data.Grupo;
import com.obelisco.modelo.data.Usuario;
import com.obelisco.modelo.servicios.seguridad.IServicioAdministrarUsuarios;
import com.obelisco.vista.componentes.ComponenteDatosListener;
import com.obelisco.vista.componentes.DobleLista;
import com.obelisco.vista.componentes.PaneSubirImagen;
import com.obelisco.vista.componentes.TablaDatosListener;
import com.obelisco.vista.componentes.TablaDatosSimple;
//import com.obelisco.vista.componentes.TextFieldFormula;
import com.obelisco.vista.componentes.TipoFuncion;
//import com.obelisco.vista.componentesAxelia.TablaDatosSimpleAxelia;
import com.obelisco.vista.controles.BindingNumericTextField;
import com.obelisco.vista.controles.BindingPasswordField;
import com.obelisco.vista.controles.BindingSelectField;
import com.obelisco.vista.controles.BindingTextArea;
import com.obelisco.vista.controles.BindingTextField;
import com.obelisco.vista.controles.TextField;
import com.obelisco.vista.plantillas.VentanaBase;

import nextapp.echo2.app.Alignment;
import nextapp.echo2.app.Column;
import nextapp.echo2.app.Component;
import nextapp.echo2.app.ContentPane;
import nextapp.echo2.app.Extent;
import nextapp.echo2.app.Row;
import nextapp.echo2.app.TextArea;
import nextapp.echo2.app.PasswordField;
import nextapp.echo2.extras.app.TabPane;
import nextapp.echo2.app.Grid;
import nextapp.echo2.app.Label;
import nextapp.echo2.app.layout.GridLayoutData;
import nextapp.echo2.extras.app.layout.TabPaneLayoutData;

public class PaneUsuario extends ContentPane implements ComponenteDatosListener {

	private Usuario usuario;
	private IServicioAdministrarUsuarios servicioAdministrarUsuarios;
	
	// Primer Tab
	private BindingTextField txtLogin;
	private BindingTextField txtNombre;
	private BindingTextArea txtDescripcion;
	private BindingTextField txtCorreo;
	private BindingPasswordField txtContrasena;
	private PasswordField txtRepetir;
	
	// Segundo Tab
	private PaneSubirImagen foto;
	
	// Tercer Tab
	private DobleLista dblGrupos;

	
	public PaneUsuario() {
		super();		
	}

	private Component configurarPrimerTab() {
		Grid grid = new Grid();
		grid.setStyleName("Obelisco.GridPaneDialogo");
		grid.setSize(2);
		
		Label label1 = new Label();
		label1.setText("Login");
		grid.add(label1);
		txtLogin = new BindingTextField(180);
		grid.add(txtLogin);
		
		Label label2 = new Label();
		label2.setText("Nombre Completo");
		grid.add(label2);
		txtNombre = new BindingTextField(250);
		
		grid.add(txtNombre);
		Label label3 = new Label();
		label3.setText("Descripcion");
		GridLayoutData lblDescripcionLayoutData = new GridLayoutData();
		lblDescripcionLayoutData.setAlignment(new Alignment(Alignment.DEFAULT,
				Alignment.TOP));
		label3.setLayoutData(lblDescripcionLayoutData);
	
		grid.add(label3);
		txtDescripcion = new BindingTextArea(300, 100);		
		grid.add(txtDescripcion);
		Label label4 = new Label();
		
		label4.setText("Contrasena");
		grid.add(label4);
		txtContrasena = new BindingPasswordField(150);
		grid.add(txtContrasena);
		
		Label label5 = new Label();		
		label5.setText("Repetir Contrasena");
		grid.add(label5);
		txtRepetir = new PasswordField();
		txtRepetir.setWidth(new Extent(150, Extent.PX));		
		grid.add(txtRepetir);
		
		Label label6 = new Label();
		label6.setText("Correo Electronico");
		grid.add(label6);		
		txtCorreo = new BindingTextField(250);		
		grid.add(txtCorreo);
		
		Column column = new Column();
		TabPaneLayoutData columnLayoutData = new TabPaneLayoutData();
		columnLayoutData.setTitle("Datos Generales");
		column.setLayoutData(columnLayoutData);	
		column.add(grid);		
		return column;
	}
	
	private Component configurarSegundoTab() {
		Grid grid = new Grid();
		grid.setStyleName("Obelisco.GridPaneDialogo");
		grid.setSize(1);
		
		foto = new PaneSubirImagen();
		GridLayoutData gridLayoutData = new GridLayoutData();
		gridLayoutData.setAlignment(new Alignment(Alignment.CENTER, Alignment.CENTER));
		this.foto.setLayoutData(gridLayoutData);
		grid.add(foto);

		Column column = new Column();
		TabPaneLayoutData columnLayoutData = new TabPaneLayoutData();
		columnLayoutData.setTitle("Foto");
		column.setLayoutData(columnLayoutData);	
		column.add(grid);		
		return column;
	}
	
	private Component configurarTercerTab() {
		Grid grid = new Grid();
		grid.setStyleName("Obelisco.GridPaneDialogo");
		grid.setSize(1);
		
		dblGrupos = new DobleLista();
		dblGrupos.setLabelOrigen("Grupos Disponibles");
		dblGrupos.setLabelDestino("Grupos Asignados");
		GridLayoutData gridLayoutData = new GridLayoutData();
		gridLayoutData.setAlignment(new Alignment(Alignment.CENTER, Alignment.CENTER));
		this.dblGrupos.setLayoutData(gridLayoutData);
		grid.add(dblGrupos);
		
		Column column = new Column();
		TabPaneLayoutData columnLayoutData = new TabPaneLayoutData();
		columnLayoutData.setTitle("Grupos");
		column.setLayoutData(columnLayoutData);	
		column.add(grid);		
		return column;
	}

	private Component ventanaPadre = null; 
	private void initComponents() {		
		if(ventanaPadre == null) {
			ventanaPadre = this.getParent();
			while (!(ventanaPadre instanceof VentanaBase)) {
				ventanaPadre = ventanaPadre.getParent();
			}
		}		
		((VentanaBase)ventanaPadre).getAreaTrabajo().removeAll();
		((VentanaBase)ventanaPadre).getAreaTrabajo().add(this.configurarPrimerTab());
		((VentanaBase)ventanaPadre).getAreaTrabajo().add(this.configurarSegundoTab());
		((VentanaBase)ventanaPadre).getAreaTrabajo().add(this.configurarTercerTab());
	}
	
	public void onCancelar() {
		// TODO Auto-generated method stub

	}

	public void onConfirmarCambios(Object objeto, TipoFuncion tipo,
			String nombre) {
		// TODO Auto-generated method stub
		usuario.setGrupos(new HashSet<Grupo>(dblGrupos.getDatosDestino()));
		servicioAdministrarUsuarios.guardarUsuario(usuario);
	}

	public void onConfirmarEliminacion(Object object) {
		// TODO Auto-generated method stub

	}

	public void setEnabled(boolean valor){		
		if (((VentanaBase)ventanaPadre).getAreaTrabajo().getComponentCount() > 0) {
			for (int i=0; i<((VentanaBase)ventanaPadre).getAreaTrabajo().getComponentCount(); i++) {
				Component component = ((VentanaBase)ventanaPadre).getAreaTrabajo().getComponent(i);
				component.setEnabled(valor);
			}
		}
	}
	
	public void onConsultar(Object objeto) {
		// TODO Auto-generated method stub
		this.setEnabled(false);
	}

	public void onCrear() {
		// TODO Auto-generated method stub

	}

	public void onFuncionPersonalizada(Object objeto, TipoFuncion funcion,
			String nombre) {
		// TODO Auto-generated method stub

	}

	public void onIncluir(Object objeto) {
		// TODO Auto-generated method stub
		
	}

	public void onInicializar() {
		// TODO Auto-generated method stub
		initComponents();
		
		// Asignar Bindings
		txtLogin.setBinding(usuario, "login");
		txtNombre.setBinding(usuario, "nombrecompleto");
		txtDescripcion.setBinding(usuario, "descripcion");		
		txtContrasena.setBinding(usuario, "contrasena");
		txtRepetir.setText(usuario.getContrasena());
		txtCorreo.setBinding(usuario, "direccioncorreo");
		foto.setBinding(usuario.getFoto(), "contenido");
		
		List disponibles = servicioAdministrarUsuarios.buscarGruposDisponibles(usuario);
		dblGrupos.setDatosOrigen(disponibles);
		ArrayList lstGrupos = new ArrayList(usuario.getGrupos());
		dblGrupos.setDatosDestino(lstGrupos);
	}	

	public void onModificar(Object objeto) {
		// TODO Auto-generated method stub
		
	}

	public void onObjetoEntidad(Object objeto) {
		// TODO Auto-generated method stub
		usuario = (Usuario) objeto;
	}

	public boolean onValidarDatos(Object objeto, TipoFuncion tipo, String nombre) {
		// TODO Auto-generated method stub
		servicioAdministrarUsuarios.comprobarContrasena(txtContrasena.getText(), txtRepetir.getText());
		return true;
	}
	
	public void onListaParametros(List arg0) {
		// TODO Auto-generated method stub
		
	}

	
	// Getter y Setter
	public IServicioAdministrarUsuarios getServicioAdministrarUsuarios() {
		return servicioAdministrarUsuarios;
	}

	public void setServicioAdministrarUsuarios(
			IServicioAdministrarUsuarios servicioAdministrarUsuarios) {
		this.servicioAdministrarUsuarios = servicioAdministrarUsuarios;
	}

}